#pragma once
#include <iostream>
#include <deque>
#include <vector>
using namespace std;

namespace own
{
	//template<class T>
	//class stack
	//{
	//private:
	//	
	//	T* _a;
	//	size_t _top;
	//	size_t _capacity;

	//};

	template<class T, class Container = deque<T>>
	class stack
	{
	public:
		bool empty()
		{
			return _con.empty();
		}

		size_t size()
		{
			return _con.size();
		}

		T& top()
		{
			return _con.back();
		}

		void push(const T& val = T())
		{
			_con.push_back(val);
		}

		void emplace(T&& val)
		{
			_con.emplace_back(std::forward<T>(val));
		}

		void pop()
		{
			_con.pop_back();
		}

	private:
		Container _con;
	};



	//template<class T>
	//class stack
	//{
	//public:
	//	stack() {}
	//	void push(const T& x) { _c.push_back(x); }
	//	void pop() { _c.pop_back(); }
	//	T& top() { return _c.back(); }
	//	const T& top()const { return _c.back(); }
	//	size_t size()const { return _c.size(); }
	//	bool empty()const { return _c.empty(); }
	//private:
	//	std::vector<T> _c;
	//};

}



//#include<deque>
//namespace own
//{
//	template<class T, class Con = deque<T>>
//	//template<class T, class Con = vector<T>>
//	//template<class T, class Con = list<T>>
//	class stack
//	{
//	public:
//		stack() {}
//		void push(const T& x) { _c.push_back(x); }
//		void pop() { _c.pop_back(); }
//		T& top() { return _c.back(); }
//		const T& top()const { return _c.back(); }
//		size_t size()const { return _c.size(); }
//		bool empty()const { return _c.empty(); }
//	private:
//		Con _c;
//	};
//}
